package com.lazy.book.service.system;


import com.lazy.book.common.entity.LoginUser;
import com.lazy.book.common.entity.PageResult;

import com.lazy.book.pojo.system.pojo.dto.common.SelectorQueryDTO;
import com.lazy.book.pojo.system.pojo.dto.sysmenu.SysUserRoleDTO;
import com.lazy.book.pojo.system.pojo.dto.sysuser.*;
import com.lazy.book.pojo.system.pojo.po.SysUser;
import com.lazy.book.pojo.system.pojo.vo.common.UserVO;
import com.lazy.book.pojo.system.pojo.vo.sysuser.SysUserRoleVO;
import com.lazy.book.pojo.system.pojo.vo.sysuser.SysUserVO;
import com.lazy.book.pojo.system.pojo.vo.sysuser.UserOptionVO;
import com.mybatisflex.core.service.IService;
import com.lazy.book.pojo.entity.SelectIdsDTO;

import java.util.List;

/**
 * <p>用户service</p>
 *
 * @author lazy
 * @since 2025-09-04
 */
public interface SysUserService extends IService<SysUser> {

  LoginUser buildLoginUser(String username, String password);

  SysUserVO getSysUserByUsername(String username);

  SysUserVO getSysUserByUserId(Long userId);

  SysUser getSysUserCacheByUserId(Long userId);

  /**
   * 创建用户
   *
   * @param dto
   *            用户信息
   */
  void create(SysUserCreateDTO dto);

  /**
   * 更新用户
   *
   * @param dto
   *            用户信息
   */
  void update(SysUserUpdateDTO dto);

  /**
   * 删除用户
   *
   * @param dto
   *            用户id数组
   */
  void remove(SelectIdsDTO dto);

  /**
   * 详情
   *
   * @param id
   *            id
   * @return {@link SysUser}
   */
  SysUserVO detail(Long id);

  PageResult<SysUserVO> page(SysUserListDTO dto);

  SysUserRoleVO findSysUserRole(Long userId);

  void changeSysUserRole(SysUserRoleDTO dto);

  /**
   * 获取用户信息
   *
   * @return {@link SysUserVO}
   */
  SysUserVO getUserInfo();

  /**
   * 更改密码
   *
   * @param dto
   *            dto
   */
  void changePassword(SysUserPasswordDTO dto);

  /**
   * 重置密码
   *
   * @param id
   *            id
   */
  void resetPassword(Long id);

  void syncUserInfo(Object userId);


  LoginUser buildLoginUser(Long userId);

  void unlock(SelectIdsDTO dto);

  void bindUserDept(UserDeptDTO dto);

  List<UserOptionVO> getUserOptions();

  PageResult<UserVO> pageSelector(SelectorQueryDTO dto);

}
